grpcurl 工具请求 gRPC
grpcurl 是一个与 grpc 服务器交互的命令行工具,可认为是 gRPC 的 curl 工具。
因为 gRPC 使用二进制编码(protobuf), 所以不能利用常规的 curl 工具(早期的 curl 版本还不支持 HTTP/2)。grpcurl 用于从命令行调用 gRPC 服务器支持的 RPC 方法
安装
go get github.com/fullstorydev/grpcurl
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
grpcurl 工具接受 json 编码的消息, 工具底层会转化为 protobuf 与服务器交互。
grpcurl 通过三种方式之一实现此目的。
- gRPC 服务器添加 gRPC 反射
- 直接读取 proto 源文件
- 加载编译后的 protoset文件(包含已被编码的proto描述文件)
使用 gRPC 反射的原理
gRPC 提供了 grpc.reflection.v1alpha.ServerReflection
服务,在 Server 端添加后可以通过该服务获取所有服务的信息,包括服务定义,方法,属性等;
可以根据获取到的服务信息调用其他的方法,实现泛化调用
// 实例化 grpc Server
s := grpc.NewServer()
// 注册 HelloService
pb.RegisterHelloServer(s, helloService)
// 注册反射服务
reflection.Register(s)
在使用 grpcurl 时,需要通过 -cert 和 -key 参数设置公钥和私钥文件,表示链接启用了 TLS 协议的服务。对于没有启用 TLS 协议的 gRPC 服务,通过 -plaintext 参数忽略 TLS 证书的验证过程。
如果是 Unix Socket 协议,则需要指定 -unix 参数。
使用例:
$ grpcurl -plaintext localhost:50052 list
# output
grpc.reflection.v1alpha.ServerReflection
hello.Hello
查看更详细的细节:
$ grpcurl -plaintext localhost:8888 describe proto.HelloService
# output
proto.HelloService is a service:
service HelloService {
rpc Channel ( stream .proto.String ) returns ( stream .proto.String );
rpc Hello ( .proto.String ) returns ( .proto.String );
}
获取类型信息:
$ grpcurl -plaintext localhost:8888 describe proto.String
proto.String is a message:
message String {
string value = 1;
}
调用服务方法:
$ grpcurl -plaintext -d '{"value":"grpcurl"}' localhost:8888 proto.HelloService/Hello
{
"value": "hello grpc"
}
References
使用 grpcurl 通过命令行访问 gRPC 服务 gRPC 反射服务 grpc命令行工具grpcurl使用 gRPC 客户端长连接机制实现及 keepalive 分析